package cn.rengy.isql;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.springframework.jdbc.core.SqlParameterValue;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
 * 可变 具名参数
 * 根据SqlParameterSource是否有值决定是否拼接
 * 
 */
@Getter
@Setter
@AllArgsConstructor
public class VariableParameterHolder implements ParameterHolder {

	private final int index;
	
	private final VariableParsedSql parsedSql;
	
	@Override
	public String parse(SqlParameterSource paramSource) {
		//TODO 同时支持  具名参数和未命名参数
		List<NamedParameterHolder> parameterHolderList=parsedSql.getNamedParameterHolderList();
		if(haveValue(parameterHolderList, paramSource)) {
			//解析
			return SqlParser.buildActualSql(parsedSql, paramSource);
		}else {
			return "";
		}
	}
	
	
	@Override
	public void appendValueList(List<Object> valueList, SqlParameterSource paramSource) {
		List<NamedParameterHolder> parameterHolderList=parsedSql.getNamedParameterHolderList();
		if(haveValue(parameterHolderList, paramSource)) {
			
			List<Object> list=SqlParser.buildValueList(parsedSql, paramSource);
			//List<Object> list=Stream.of(arrays).collect(Collectors.toList());
			valueList.addAll(list);
		}
	}

	/**
	 * 所有变量是否全部有值
	 */
	static boolean haveValue(List<NamedParameterHolder> parameterHolderList,SqlParameterSource paramSource) {
		
		boolean isContains=true;
		if(paramSource==null||parameterHolderList.isEmpty()) {
			isContains=false;
		}else {
			for(NamedParameterHolder parameterHolder:parameterHolderList){
				String parameterName=parameterHolder.getParameterName();
				if(!paramSource.hasValue(parameterName)) {
					isContains=false;
					break;
				}
				Object paramValue=paramSource.getValue(parameterName);
				if(paramValue==null) {
					isContains=false;
					break;
				}
				if (paramValue instanceof SqlParameterValue) {
					paramValue = ((SqlParameterValue) paramValue).getValue();
				}
				if (paramValue instanceof Object[]) {
					paramValue=Arrays.asList((Object[])paramValue);
				}
				if (paramValue instanceof Collection) {
					if(((Collection) paramValue).isEmpty()) {
						paramValue=null;
					}
				}
				if(paramValue instanceof String) {
					if(((String) paramValue).length()==0) {
						paramValue=null;
					}
				}
				if(paramValue==null) {
					isContains=false;
					break;
				}
			}
		}
		return isContains;
	}
	
	@Override
	public int getStartIndex() {
		return index;
	}


	@Override
	public int getEndIndex() {
		return index;
	}


//	@Override
//	public String getParameterName() {
//		throw new IllegalArgumentException("可变参数没有ParameterName");
//	}
	
}